//
//  ZJView.m
//  DrawDemo
//
//  Created by ZJ on 2018/8/3.
//  Copyright © 2018年 iCatch Technology Inc. All rights reserved.
//

#import "ZJView.h"

@implementation ZJView


// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
    
    [self test22];
}

#pragma mark - 绘图样式
// oc 设置绘图样式
- (void)test22 {
    // 创建路径
    UIBezierPath *path = [UIBezierPath bezierPath];
    
    // 拼接路径
    [path moveToPoint:CGPointMake(150, 150)];
    [path addLineToPoint:CGPointMake(200, 200)];
    [path addLineToPoint:CGPointMake(250, 150)];
    
    // 设置线宽
    [path setLineWidth:20];
    // 设置连接处的样式
    [path setLineJoinStyle:kCGLineJoinBevel];
    // 设置头尾样式
    [path setLineCapStyle:kCGLineCapRound];
    
    // 渲染（渲染的方式）
    [path stroke];
    [path fill];
    
    // 奇偶填充规则（奇填偶不填）
    // --- 非零绕数
    // 默认填充模式: nonzero winding number rule(非零绕数规则)从左到右跨过, +1。从右到左跨过, -1。最后如果为0, 那么不填充, 否则填充
//    path.usesEvenOddFillRule = YES;
}

// c 设置绘图样式
- (void)test21 {
    // 获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 拼接路径 把路径添加到上下文
    CGContextMoveToPoint(ctx, 50, 50);
    CGContextAddLineToPoint(ctx, 100, 100);
    CGContextAddLineToPoint(ctx, 150, 50);
    
    // 线宽
    CGContextSetLineWidth(ctx, 20);
    
    // 连接处的样式
    // kCGLineJoinMiter, // 默认
    // kCGLineJoinRound, // 圆角
    // kCGLineJoinBevel // 切角
    CGContextSetLineJoin(ctx, kCGLineJoinRound);
    
    // 头尾样式
    // kCGLineCapButt, // 默认
    // kCGLineCapRound, // 圆角
    // kCGLineCapSquare // 会比默认的样式两边各多一个线宽/2的距离
    CGContextSetLineCap(ctx, kCGLineCapSquare);
    
    // 渲染
//    CGContextStrokePath(ctx);
    // 渲染方式
//    kCGPathFill,          填充
//    kCGPathEOFill,        奇偶填充规则
//    kCGPathStroke,        描边
//    kCGPathFillStroke,    既填充又描边
//    kCGPathEOFillStroke   奇偶填充 + 描边
    CGContextDrawPath(ctx, kCGPathEOFill);
}

#pragma mark - 绘图练习
// 画扇形
- (void)test15 {
    UIBezierPath *path = [UIBezierPath bezierPath];
    
    [path moveToPoint:CGPointMake(150, 150)];
    [path addArcWithCenter:CGPointMake(150, 150) radius:100 startAngle:0 endAngle:M_PI_4 clockwise:YES];
    [path addLineToPoint:CGPointMake(150, 150)];
    
    [path stroke];
}

// 圆弧
- (void)test14 {
    /**
     画圆弧
     ArcCenter：圆心位置
     radius：半径
     startAngle：起始位置
     endAngle：结束位置
     clockwise：是否是顺时针
     */
    
    // oc 画圆弧
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(150, 150) radius:100 startAngle:0 endAngle:M_PI_2 clockwise:YES];
    
    [path stroke];
    
    
    // c 画圆弧
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // c 中的clockwise与oc的相反，0：顺时针 1：逆时针
    CGContextAddArc(ctx, 100, 100, 100, 0, M_PI_2, 0);
    
    CGContextStrokePath(ctx);
}

// 椭圆
- (void)test13 {
    // oc 椭圆
    /*
    // 创建路径
    UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(100, 100, 200, 100)];
    
    [path stroke];
     */
    
    // c 椭圆
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 拼接路径
    CGContextAddEllipseInRect(ctx, CGRectMake(50, 50, 200, 100));
    
    // 渲染
    CGContextStrokePath(ctx);
}

// 圆角矩形
- (void)test12 {
    // 创建路径
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(100, 100, 100, 100) cornerRadius:30];
    
    // 渲染
    [path stroke];
}

// 矩形
- (void)test11 {
    // 创建路径
    UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(100, 100, 100, 100)];
    
    // 渲染
    [path stroke];
}

#pragma mark - 绘图的5种方式
- (void)test5 {
    // 创建路径对象
    UIBezierPath *path = [UIBezierPath bezierPath];
    
    // 通过路径对象 拼接路径
    [path moveToPoint:CGPointMake(50, 50)];
    [path addLineToPoint:CGPointMake(200, 200)];
    
    // 渲染
    [path stroke];
}

// c + oc 把CGPath 转化成 oc的path
- (void)test4 {
    // 1.获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 2.拼接路径（c）
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, 50, 50);
    CGPathAddLineToPoint(path, NULL, 100, 100);
    
    // 3.拼接路径（oc）
    UIBezierPath *path1 = [UIBezierPath bezierPathWithCGPath:path];
    [path1 addLineToPoint:CGPointMake(150, 50)];
    
    // 4.把路径添加到上下文
    CGContextAddPath(ctx, path1.CGPath);
    
    // 5.渲染
    CGContextSetStrokeColorWithColor(ctx, [UIColor purpleColor].CGColor);
    CGContextStrokePath(ctx);
}

// c + oc 基本等同于第二种 把oc的path 转化成 CGPath
- (void)test3 {
    // 1.获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 2.拼接路径
    UIBezierPath *path = [[UIBezierPath alloc] init];
    [path moveToPoint:CGPointMake(50, 50)];
    [path addLineToPoint:CGPointMake(100, 100)];
    
    // 3.把路径添加到上下文（把oc的path转成c的path）
    CGContextAddPath(ctx, path.CGPath);
    
    // 4.渲染
    CGContextSetStrokeColorWithColor(ctx, [UIColor orangeColor].CGColor);
    CGContextStrokePath(ctx);
}

// c 先拼接路径 再把路径添加到上下文当中
- (void)test2 {
    // 1.获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 2.拼接路径
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, 50, 50);
    CGPathAddLineToPoint(path, NULL, 100, 100);
    
    // 3.把路径添加到上下文
    CGContextAddPath(ctx, path);
    
    // 4.渲染
    CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor);
    CGContextStrokePath(ctx);
}

// c 直接在上下文当中拼接路径
- (void)test1 {
    // 1.获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 2.拼接路径
    // 3.把路径添加到上下文
    CGContextMoveToPoint(ctx, 50, 50);
    CGContextAddLineToPoint(ctx, 100, 100);
    
    // 4.渲染
    CGContextStrokePath(ctx);
}

@end
